﻿using System.Diagnostics;

namespace Sage.WindowsProcess.Events
{
    /// <summary>
    /// 为进程事件提供数据的基类。
    /// </summary>
    /// <remarks>
    /// 初始化 ProcessEventArgs 类的新实例。
    /// </remarks>
    /// <param name="process">关联的进程。</param>
    public class ProcessEventArgs(Process process) : EventArgs
    {

        /// <summary>
        /// 获取关联的进程。
        /// </summary>
        public Process Process { get; } = process ?? throw new ArgumentNullException(nameof(process));
    }

    /// <summary>
    /// 为进程输出事件提供数据。
    /// </summary>
    /// <remarks>
    /// 初始化 ProcessOutputEventArgs 类的新实例。
    /// </remarks>
    /// <param name="data">输出数据。</param>
    public class ProcessOutputEventArgs(string data) : EventArgs
    {

        /// <summary>
        /// 获取输出数据。
        /// </summary>
        public string Data { get; } = data ?? throw new ArgumentNullException(nameof(data));

        /// <summary>
        /// 获取输出的时间戳。
        /// </summary>
        public DateTime Timestamp { get; } = DateTime.Now;
    }

    /// <summary>
    /// 为进程退出事件提供数据。
    /// </summary>
    /// <remarks>
    /// 初始化 ProcessExitedEventArgs 类的新实例。
    /// </remarks>
    /// <param name="process">关联的进程。</param>
    /// <param name="exitCode">进程的退出代码。</param>
    public class ProcessExitedEventArgs(Process process, int exitCode) : ProcessEventArgs(process)
    {

        /// <summary>
        /// 获取进程的退出代码。
        /// </summary>
        public int ExitCode { get; } = exitCode;
    }

    /// <summary>
    /// 为进程错误事件提供数据。
    /// </summary>
    /// <remarks>
    /// 初始化 ProcessErrorEventArgs 类的新实例。
    /// </remarks>
    /// <param name="errorMessage">错误消息。</param>
    /// <param name="exception">关联的异常（可选）。</param>
    public class ProcessErrorEventArgs(string errorMessage, Exception? exception = null) : EventArgs
    {

        /// <summary>
        /// 获取错误消息。
        /// </summary>
        public string ErrorMessage { get; } = errorMessage ?? throw new ArgumentNullException(nameof(errorMessage));

        /// <summary>
        /// 获取关联的异常（如果有）。
        /// </summary>
        public Exception? Exception { get; } = exception;

        /// <summary>
        /// 获取错误的时间戳。
        /// </summary>
        public DateTime Timestamp { get; } = DateTime.Now;
    }

    /// <summary>
    /// 为进程状态更新事件提供数据。
    /// </summary>
    /// <remarks>
    /// 初始化 ProcessStatusEventArgs 类的新实例。
    /// </remarks>
    /// <param name="process">关联的进程。</param>
    /// <param name="cpuUsage">CPU使用率。</param>
    /// <param name="memoryUsage">内存使用量。</param>
    /// <param name="runningTime">运行时间。</param>
    /// <param name="threadCount">线程数。</param>
    public class ProcessStatusEventArgs(
        Process process,
        double cpuUsage,
        long memoryUsage,
        TimeSpan runningTime,
        int threadCount) : ProcessEventArgs(process)
    {

        /// <summary>
        /// 获取CPU使用率（百分比）。
        /// </summary>
        public double CpuUsage { get; } = cpuUsage;

        /// <summary>
        /// 获取内存使用量（以字节为单位）。
        /// </summary>
        public long MemoryUsage { get; } = memoryUsage;

        /// <summary>
        /// 获取进程的运行时间。
        /// </summary>
        public TimeSpan RunningTime { get; } = runningTime;

        /// <summary>
        /// 获取进程的线程数。
        /// </summary>
        public int ThreadCount { get; } = threadCount;

        /// <summary>
        /// 获取状态更新的时间戳。
        /// </summary>
        public DateTime Timestamp { get; } = DateTime.Now;
    }
}
